package GUI;

import Interaction.ServerConnection;
import java.util.Date;
// Quelle: http://nachocalendar.sourceforge.net/
import net.sf.nachocalendar.CalendarFactory;
import net.sf.nachocalendar.components.DateField;
import java.rmi.RemoteException;
import javax.swing.DefaultComboBoxModel;
import Flightadministration.*;
import Data.*;
import Report.*;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 * 
 */
public class ReportShowPassengerinformation extends JPanel {

    final Main td;
    public DefaultTableModel model;
    public JTable table;
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
     *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();
    // Report-Objekt
    private ReportGenerator report = new ReportGeneratorImpl();
    // Vector für Tabellenüberschriften
    public Vector<String> columnNames;
    // Vector für Tabelleninhalt
    public Vector<Vector> rowData;
    public Vector<Airline> allAirlines;
    public Vector<String> allAirlineNames;
    public JComboBox comboBox1;
    public DefaultComboBoxModel model1;
    public DateField datefield;
    public DateField datefield1;
    

    // Konstruktor
    public ReportShowPassengerinformation (final Main td) throws java.rmi.RemoteException {

        this.td = td;
        showReportShowPassengerinformation();
    }


    // Methoden
    public void showReportShowPassengerinformation() throws RemoteException {
        
        //GridBagLayout
        //**********************************************************************

        GridBagLayout gbl = new GridBagLayout();
        this.setLayout(gbl);
        this.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Table
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Report mit sämtlichen Flügen eines Passagiers erstellen</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 4;
        this.add(headline, constraints);

        // Vector erzeugen und die Bezeichnungen der Tabellenspalten hinzufügen
        columnNames = new Vector<String>();
            columnNames.add("Kundennr.");
            columnNames.add("Vorname");
            columnNames.add("Nachname");
            columnNames.add("Straße");
            columnNames.add("PLZ");
            columnNames.add("Wohnort");

        // Vector mit Werten für JTable belegen
        rowData = admin.getAllPassengersForTable();

        model = new DefaultTableModel( rowData, columnNames );
        model.addTableModelListener(table);

        table = new JTable(model) {
            @Override
            // Zellen nicht editierbar setzen
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 4;
        table.setPreferredScrollableViewportSize(new Dimension(400,200));
        table.setVisible(true);
        this.add( new JScrollPane(table), constraints);


        //Label/Textfields
        //**********************************************************************
        
        JLabel label5 = new JLabel("Fluglinie: ");
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        this.add(label5, constraints);

        // Vector mit allen Fluglinien aus der Datenbank befüllen
        allAirlines = admin.getAllAirlinesForComboBox();
        // Vector mit Namen aller Fluglinien aus der Datenbank befüllen
        allAirlineNames = admin.getAllAirlineNamesForComboBox();
        // Neues Model für die ComboBox erzeugen und die Fluglinienbezeichnungen übergeben
        model1 = new DefaultComboBoxModel(allAirlineNames);

        comboBox1 = new JComboBox();
        comboBox1.setModel(model1);
        constraints.gridx = 1;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        this.add(comboBox1, constraints);

        JLabel label6 = new JLabel("Zeitraum von: ");
        constraints.gridx = 0;
        constraints.gridy = 3;
        this.add(label6, constraints);

        datefield = CalendarFactory.createDateField();
        constraints.gridx = 1;
        constraints.gridy = 3;
        this.add(datefield, constraints);

        JLabel label7 = new JLabel("Zeitraum bis: ");
        constraints.gridx = 2;
        constraints.gridy = 3;
        this.add(label7, constraints);

        datefield1 = CalendarFactory.createDateField();
        constraints.gridx = 3;
        constraints.gridy = 3;
        this.add(datefield1, constraints);


        //Buttons
        //**********************************************************************

        JButton button_CreateReport = new JButton("Report erstellen");
        constraints.gridx = 0;
        constraints.gridy = 4;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.gridwidth = 2;
        this.add(button_CreateReport, constraints);

        JButton button_Back = new JButton("Zurück");
        constraints.gridx = 2;
        constraints.gridy = 4;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.gridwidth = 2;
        this.add(button_Back, constraints);


        //Action Listener
        //**********************************************************************
        table.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent evt){

                //Nur auf Doppelklick der linken Mousetaste reagieren.
                if(evt.getButton() == MouseEvent.BUTTON1 && evt.getClickCount() > 1){
                    createReport();
                    
                }
            }
        });


        button_CreateReport.addActionListener(new ActionListener() {
                @Override

            public void actionPerformed(ActionEvent e) {
                    createReport();
//                // Prüfen ob keine Zeile (-1) ausgewählt wurde
//                if (table.getSelectedRow()== -1) {
//                    JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Spalte auswählen!");
//                }
//                else if (comboBox1.getSelectedItem().equals("Bitte auswählen")) {
//                            JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Fluglinie aus!");
//                        }
//                        else {
//                            try {
//                                // Die Kundennr. des aktuell ausgewählten Passagiers auslesen
//                                int currentRow = table.getSelectedRow();
//                                Object currentPassangerId = table.getModel().getValueAt(currentRow, 0);
//                                String currentPassangerIdAsString = currentPassangerId.toString();
//                                int currentPassangerIdAsInt = Integer.parseInt(currentPassangerIdAsString);
//
//                                // Den Namen der ausgewählten Fluglinie (Airline) aus der Combobox auslesen
//                                Object currentAirline = comboBox1.getSelectedItem();
//                                String currentAirlineAsString = currentAirline.toString();
//                                int currentAirlineAsInt = 0;
//                                // Über eine for-Schleife die Id der Fluglinie auslesen und in die Variable 'currentAirlineAsInt' speichern
//                                for(int i = 0; i<allAirlines.size(); i++) {
//                                    if(allAirlines.get(i).getAirName().equals(currentAirlineAsString)) {
//                                        currentAirlineAsInt = allAirlines.get(i).getAirId();
//                                    }
//                                }
//
//                                // Start- und Enddatum des gewünschten Zeitraums aus Datefields auslesen und in Date-Objekte speichern
//                                Date d1 = (Date) datefield.getValue();
//                                Date d2 = (Date) datefield1.getValue();
//
//                                // Report erzeugen
//                                FlightmovementsOfSpecificPassengerReport r =
//                                        report.createFlightmovementsOfSpecificPassengerReport(currentPassangerIdAsInt, currentAirlineAsInt, d1, d2);
//                                // Report ausgeben
//                                report.outputFlightmovementsOfSpecificPassengerReport(r);
//
//                            }
//                            catch (RemoteException ex) {
//                                System.out.println(ex);
//                            }
//                        }
            }
        });

        
        button_Back.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                ((CardLayout) td.rightp.getLayout()).show(td.rightp,"InfoTextReport");
            }
        });
    }

    public void createReport() {
                // Prüfen ob keine Zeile (-1) ausgewählt wurde
                if (table.getSelectedRow()== -1) {
                    JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Spalte auswählen!");
                }
                else if (comboBox1.getSelectedItem().equals("Bitte auswählen")) {
                            JOptionPane.showMessageDialog(null, "Bitte wählen Sie eine Fluglinie aus!");
                        }
                        else {
                            try {
                                // Die Kundennr. des aktuell ausgewählten Passagiers auslesen
                                int currentRow = table.getSelectedRow();
                                Object currentPassangerId = table.getModel().getValueAt(currentRow, 0);
                                String currentPassangerIdAsString = currentPassangerId.toString();
                                int currentPassangerIdAsInt = Integer.parseInt(currentPassangerIdAsString);

                                // Den Namen der ausgewählten Fluglinie (Airline) aus der Combobox auslesen
                                Object currentAirline = comboBox1.getSelectedItem();
                                String currentAirlineAsString = currentAirline.toString();
                                int currentAirlineAsInt = 0;
                                // Über eine for-Schleife die Id der Fluglinie auslesen und in die Variable 'currentAirlineAsInt' speichern
                                for(int i = 0; i<allAirlines.size(); i++) {
                                    if(allAirlines.get(i).getAirName().equals(currentAirlineAsString)) {
                                        currentAirlineAsInt = allAirlines.get(i).getAirId();
                                    }
                                }

                                // Start- und Enddatum des gewünschten Zeitraums aus Datefields auslesen und in Date-Objekte speichern
                                Date d1 = (Date) datefield.getValue();
                                Date d2 = (Date) datefield1.getValue();

                                // Report erzeugen
                                FlightmovementsOfSpecificPassengerReport r =
                                        report.createFlightmovementsOfSpecificPassengerReport(currentPassangerIdAsInt, currentAirlineAsInt, d1, d2);
                                // Report ausgeben
                                report.outputFlightmovementsOfSpecificPassengerReport(r);

                            }
                            catch (RemoteException ex) {
                                System.out.println(ex);
                            }
                        }
    }

    
    public void updateTableData() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData = admin.getAllPassengersForTable();

        // Tabelleninhalt wird aktualisiert
        model.setDataVector(rowData, columnNames);

    }

}






